import paramiko
from os import path
import time
class Updater():
    def __init__(self,localpath,serverpath) -> None:
        self.localpath = localpath # 本地同步目录
        self.serverpath = serverpath # 服务器中转目录
        self.transport = None # 连接
        self.sftp = None # sftp实例
        self.username = None # 用户名
        self.password = None # 密码
        self.host = None # 服务器地址
        self.port = None # 服务器端口，默认22
        self.cacheFileNum = 50 # 服务器最多暂存的历史文件数量
        self.lastfile = '' # 最后一次更新的文件名
    
    # 首次启动要获取一次连接
    def get_connect(self,host,username,password,port=22):
        if not hasattr(self.transport,'connect'):
            try:# 建立连接
                self.transport = paramiko.Transport((host, int(port)))
            except:
                print('无法连接服务器')
                return '无法连接服务器'
        self.host = host # 储存服务器地址
        self.port = port # 储存服务器端口
        try: # 获取sftp实例
            if not self.transport.active:
                self.transport.connect(username=username, password=password)
            self.sftp = paramiko.SFTPClient.from_transport(self.transport)
        except:
            print('建立sftp连接失败')
            return '建立sftp连接失败'
        self.username = username # 储存用户名
        self.password = password # 储存密码
        print('sftp连接建立成功')
        return 'sftp连接建立成功'
        
    # 上传文件
    def put(self,file):
        self.get_connect(self.host,self.username,self.password,self.port)
        # 文件绝对路径
        loacalpth = path.join(self.localpath,file)
        if not path.exists(loacalpth):
            print(f'{loacalpth} 不存在')
            return
        # 在服务器上的名字，以实时时间格式为主
        serverfile = time.strftime('%Y-%m-%d_%H-%M-%S') + '.zip'
        serverpath = self.serverpath+'/'+serverfile
        # 上传文件
        self.sftp.put(loacalpth,serverpath)
        print(serverfile,'已上传')
        # 获取服务器缓存文件列表
        serverfiles = self.sftp.listdir(self.serverpath)
        # 从大到小排序
        serverfiles.sort(reverse=True)
        # 超出缓存数量时，删除旧的
        while(len(serverfiles)>self.cacheFileNum):
            rmfile = self.serverpath + '/' + serverfiles.pop()
            self.sftp.remove(rmfile)
            print(f'删除 {rmfile}')
        if hasattr(self.sftp,'close'):
            self.sftp.close()
        return serverfile
    
    # 下载文件
    def get(self):
        self.get_connect(self.host,self.username,self.password,self.port)
        
        # 获取服务器缓存文件目录
        serverfiles = self.sftp.listdir(self.serverpath)
        # 从大到小排序
        serverfiles.sort(reverse=True)
        # 如果当前文件和最后一次更新的文件相等，则不更新
        if self.lastfile == serverfiles[0]:
            return ''
        self.lastfile = serverfiles[0]
        # 下载文件
        remotefile = self.serverpath + '/' +self.lastfile
        localfile = path.join(self.localpath,self.lastfile)
        self.sftp.get(remotefile,localfile)
        print(f'更新了文件 {localfile}')
        if hasattr(self.sftp,'close'):
            self.sftp.close()
        return localfile
        
        